home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BUG 1
/
BUGCD1996_0708.ISO
/
pc
/
util
/
minilin
/
minilin.exe
/
SBIN
/
INSTALLP.{_4
< prev
next >
Wrap
Text File
|
1994-05-22
|
9KB
|
243 lines
#!/bin/sh
# Copyright 1994, Patrick Volkerding, Moorhead, Minnesota USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
make_install_script() {
COUNT=1
LINE="`sed -n "$COUNT p" $1`"
while [ ! "$LINE" = "" ]; do
LINKGOESIN="`echo "$LINE" | cut -f 1 -d " "`"
LINKGOESIN="`dirname $LINKGOESIN`"
LINKNAMEIS="`echo "$LINE" | cut -f 1 -d ' '`"
LINKNAMEIS="`basename "$LINKNAMEIS"`"
LINKPOINTSTO="`echo "$LINE" | cut -f 3 -d ' '`"
echo "( cd $LINKGOESIN ; rm -rf $LINKNAMEIS )"
echo "( cd $LINKGOESIN ; ln -sf $LINKPOINTSTO $LINKNAMEIS )"
COUNT=`expr $COUNT + 1`
LINE="`sed -n "$COUNT p" $1`"
done
}
usage() {
cat << EOF
Usage: installpkg package_name
installpkg -warn package_name
installpkg -r package_name
installpkg -m package_name
Usually used to install a .tgz or .tar.gz package like this:
installpkg xf_bin.tgz
-warn does not install, but tells you what would be deleted or overwritten.
You can also install recursively from the current location, like this:
installpkg -r uucp
It is also possible to make a "*.tgz" package with a command like this:
installpkg -m uucp
(When you use "-m", the package will not be installed.)
In this case, everything from the current directory and all subdirectories
will be copied onto / as a package. The appropriate files under
/var/adm/packages and /var/adm/scripts will be created for a new package
called "uucp", and you will be able to review/remove the package just as
easily as any other Slackware package.
EOF
}
# These tests, while by no means exhaustive, will give a usage message
# and exit with a wide range of bad input.
if [ "$1" = "-warn" -a -f "$2" ]; then # -warn
echo "Scanning the contents of $2..."
echo
mkdir -p /tmp/scan
( cd /tmp/scan ; tar xzf - install/doinst.sh ) < $2 2> /dev/null
if [ -r /tmp/scan/install/doinst.sh ]; then
if cat /tmp/scan/install/doinst.sh | fgrep 'rm -rf' 1>/dev/null 2>/dev/null ; then
cat /tmp/scan/install/doinst.sh | fgrep 'rm -rf' > /tmp/scan/install/delete
echo "The following locations will be completely WIPED OUT to allow symbolic"
echo "links to be made. (We're talking 'rm -rf') These locations may be files,"
echo "or entire directories."
echo
echo "Be sure you've backed up anything at these locations that you want to"
echo "save before you install this package:"
echo
cat /tmp/scan/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'
fi
if [ -d /tmp/scan ]; then
( cd /tmp/scan ; rm -rf install ) 2> /dev/null
( cd /tmp ; rmdir scan ) 2> /dev/null
fi
fi
echo
echo "The following files will be overwritten when installing this package."
echo "Be sure they aren't important before you install this package:"
echo
( tar tzvvf - ) < $2 | fgrep -v 'drwx'
echo "You've been warned."
exit
fi
if [ $# = 2 -a ! "$1" = "-m" -a ! "$1" = "-r" -a ! -r "$1" ]; then
usage;
exit
elif [ $# = 0 ]; then
usage;
exit
fi
if [ $# = 1 -a ! -r "$1" ]; then
echo "Package not found: $1"
echo
usage;
exit
fi
if [ "$1" = "-r" -o "$1" = "-m" ]; then
if [ -r "/var/adm/packages/$2" -a ! "$1" = "-m" ]; then
echo
echo "Hey - there's already a package named '$2'! You really should remove"
echo "that before attempting to install another package with that name,"
echo "since the old indexes for that package will be overwritten and you'll"
echo "have to remove any leftover files and links manually."
echo
echo -n "Do you want to exit ([y]es, [n]o)? "
read EXIT;
if [ "$EXIT" = "y" ]; then
exit
fi
fi
echo
echo "Do you want to convert the symbolic links in this package into an"
echo "installation script named ./install/doinst.sh? If you do, the symbolic"
echo "links will be removed. You can get them back easily, though, by typing"
echo
echo "sh install/doinst.sh"
echo
echo "in the package's root directory."
echo
echo "It is recommended that you convert your links for best results."
echo
echo -n "Convert links to an install script ([y]es, [n]o)? "
read CONVERT_LINKS;
echo
if [ "$CONVERT_LINKS" = "y" ]; then
echo "Having a good look at your symbolic links..."
echo
find . -type l -exec ls -l {} \; | cut -b58- | tee /tmp/iNsT-a.$$
echo
if [ ! -d install ]; then
mkdir install
fi
if [ -r install/doinst.sh ]; then
cat << EOF
You already have an installation script named install/doinst.sh.
You have 3 choices:
1 - append the script code to create these links (if any) to the end of the
existing installation script.
2 - erase the existing installation script, and replace it with the
code to create these new links.
3 - Abort! Exit this script.
EOF
echo -n "Which choice would you like (1,2,3)? "
read DOINST;
if [ "$DOINST" = "1" ]; then
echo "Appending to existing script..."
echo
make_install_script /tmp/iNsT-a.$$ | tee --append install/doinst.sh
elif [ "$DOINST" = "2" ]; then
echo "Replacing existing script..."
echo
make_install_script /tmp/iNsT-a.$$ | tee install/doinst.sh
else
rm -f /tmp/iNsT-a.$$
exit
fi
else # no script exists:
echo "Making your install script..."
echo
make_install_script /tmp/iNsT-a.$$ | tee install/doinst.sh
fi # is there already a script?
rm -f /tmp/iNsT-a.$$
echo
echo "Removing the symbolic links:"
echo
find . -type l -print -exec rm {} \;
echo
fi # make install script?
# Install the package:
if [ "$1" = "-r" ]; then # install
if [ -r install/doinst.sh ]; then # hey, did we do anything?
# Put the backup of the script in place
cp install/doinst.sh /var/adm/scripts/$2
chmod 755 /var/adm/scripts/$2
fi
# Write the filelist out:
echo "PACKAGE NAME: $2" > /var/adm/packages/$2
echo "FILE LIST:" >> /var/adm/packages/$2
echo "./" >> /var/adm/packages/$2
find . -type f -print | cut -b3- >> /var/adm/packages/$2
# Copy the stuff into place:
echo "Installing your new package onto /..."
cp -a . /
( cd / ; sh install/doinst.sh ; rm install/doinst.sh ; rmdir install )
elif [ "$1" = "-m" ]; then
echo "Making $2.tgz..."
tar czf $2.tgz .
fi
else # we're just going to try to install each argument as a package:
for package in $* ; do
echo -n "Installing package $package... "
# This stuff looks for symbolic links that also belong to other packages and
# leaves them in place. That way, if you have a couple package pointing to
# /usr/include on the cdrom and delete one, you'll still have include files.
shortname=`basename $package .tgz`
ADM_DIR="/var/adm"
TMP=/tmp
if [ -r $ADM_DIR/scripts/$shortname ]; then
cat $ADM_DIR/scripts/$shortname | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
if [ ! -d $ADM_DIR/removed_scripts ]; then
mkdir -p $ADM_DIR/removed_scripts
fi
mv $ADM_DIR/scripts/$shortname $ADM_DIR/removed_scripts 1> /dev/null 2>&1
cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links
comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
( cd / ; sh $TMP/delscript )
rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
fi
echo "FILE LIST:" > /var/adm/packages/$shortname
( cd / ; tar -xzlpvf - ) < $package >> /var/adm/packages/$shortname
if [ -f /install/doinst.sh ]; then
echo -n "executing install script..."
( cd / ; sh install/doinst.sh -install; )
fi
# Clean up the mess...
if [ -d /install ]; then
cp /install/doinst.sh /var/adm/scripts/$shortname
chmod 755 /var/adm/scripts/$shortname
(cd /install ; rm -r -f doin* 1> /dev/null 2>&1 )
rmdir /install 1> /dev/null 2>&1
fi
echo
done
fi
echo